767_count_domens#788
Conversation
|
Запрещенные домены не добавлял проверку, так как есть уже критерий banned_words_in_lit, который уже проверяет это момент (тестировал). |
HadronCollider
left a comment
There was a problem hiding this comment.
Исправьте логику в #776 и подтяните изменения
После поставьте лейбл "need_review"
| return start_index | ||
|
|
||
| def find_domains(self, sources: str): | ||
| pattern = r'(?:https?|ftp)?://([^/\s?#]+)' |
There was a problem hiding this comment.
Вынесите в поле класса
| if match and match.group(1): | ||
| self.literature_domains.append(match.group(1)) | ||
| else: | ||
| self.literature_domains.append('') #чтобы можно было определить номер |
There was a problem hiding this comment.
Сократите до 1 строки (тернарный оператор)
| break | ||
| return start_index | ||
|
|
||
| def find_domains(self, sources: str): |
There was a problem hiding this comment.
смысла в этой функции как методе класса - 0 (он ещё и меняет состояние объекта, хотя вроде как должен просто найти домены) - проще regexp использовать в count_sources_*, и self.literature_domains.append делать там же (там будет и доступ к индексу)
| if match and match.group(1): | ||
| self.literature_domains.append(match.group(1)) | ||
| else: | ||
| self.literature_domains.append('') #чтобы можно было определить номер |
There was a problem hiding this comment.
Чтобы определить номер, достаточно хранить его - вместе с доменом, иначе у вас есть список из 100 пустых строк (=много источников), потому что доменов среди нет нет
| counter = Counter([text.lower() for text in self.literature_reference_text]) | ||
| def checking_duplicate_sources(self, sources: list[str], max_count: int) -> list: | ||
| """Функция нахождения дубликатов в определенных позициях""" | ||
| counter = Counter([text.lower() for text in sources]) |
There was a problem hiding this comment.
замените лист на генератор - он будет работать быстрее и меньше займет памяти
| for text, count in counter.items(): | ||
| if count >= 2: | ||
| positions_duplicates = [i + 1 for i, text_in_ref in enumerate(self.literature_reference_text) if text == text_in_ref.lower()] | ||
| if count >= max_count and text != '': |
There was a problem hiding this comment.
Чтобы не делать на каждом шаге итерации сравнение text != '' - можно ещё на этапе формирования Counter не добавлять эти строки (например, фильтруя text.lower() for text in sources if text.strip())
| def checking_duplicate_sources(self) -> list: | ||
| """Функция нахождения дубликатов в источниках""" | ||
| counter = Counter([text.lower() for text in self.literature_reference_text]) | ||
| def checking_duplicate_sources(self, sources: list[str], max_count: int) -> list: |
There was a problem hiding this comment.
добавьте для max_count значение по умолчанию (= исходная логика с дубликатами источников)
8c9ae65 to
1aa4a13
Compare
| def count_sources_vkr(self, header): | ||
| literature_counter = 0 | ||
| if not len(header["child"]): | ||
| return literature_counter | ||
| for child in header["child"]: | ||
| if child["text"].startswith('ПРИЛОЖЕНИЕ'): | ||
| break | ||
| # if re.search(f"дата обращения", child["text"].lower()): | ||
| literature_counter += 1 | ||
| self.literature_reference_text.append(child["text"]) | ||
| self.literature_reference_text.append((literature_counter, child["text"])) | ||
| domain_match = re.search(self.domain_pattern, child["text"], re.IGNORECASE) | ||
|
|
||
| if domain_match and domain_match.group(1): | ||
| self.literature_domains.append((literature_counter, domain_match.group(1))) | ||
|
|
||
| return literature_counter | ||
|
|
||
| def count_sources(self): | ||
| literature_counter = 0 | ||
| start_page, end_page = self.search_literature_start_pdf() | ||
| for i in range(start_page, end_page + 1): | ||
| one_page = self.file.pdf_file.text_on_page[i].split('\n') | ||
| first_string = -1 | ||
| last_string = len(one_page) | ||
|
|
||
| for j in range(len(one_page)): | ||
| one_str_lowercase = one_page[j].lower() | ||
| if re.search(self.name_pattern, one_str_lowercase): | ||
| first_string = j | ||
| break | ||
| for j in range(first_string, len(one_page)): | ||
| if re.search('приложение а[\n .]', one_page[j].lower()): | ||
| last_string = j | ||
| break | ||
|
|
||
| for ind in range(first_string + 1, last_string): | ||
| if re.match(f"{literature_counter + 1}.", one_page[ind]): | ||
| literature_counter += 1 | ||
| self.literature_reference_text.append(one_page[ind]) | ||
| self.literature_reference_text.append((literature_counter, one_page[ind])) | ||
| domain_match = re.search(self.domain_pattern, one_page[ind]) | ||
| if domain_match and domain_match.group(1): | ||
| self.literature_domains.append((literature_counter, domain_match.group(1))) | ||
|
|
||
| return literature_counter |
There was a problem hiding this comment.
сделайте один итоговый метод, который будет поддерживать всё (и docx с вкр/лр и markdown) читая только текст (а не пдф)
никакого смысла в разделении логики нет
| for number, domain in sources: | ||
| if domain not in domain_to_numbers: | ||
| domain_to_numbers[domain] = [] | ||
| domain_to_numbers[domain].append(number) |
There was a problem hiding this comment.
достаточно сделать
for number, domain in sources:
domain_to_numbers.setdefault(domain, []).append(number)| duplicates_domains = self.checking_duplicate_sources(self.literature_domains, self.max_count_domains) | ||
| references, ref_sequence = self.search_references(start_literature_par) | ||
| all_numbers = set(range(1, number_of_sources + 1)) | ||
| if len(references.symmetric_difference(all_numbers)) == 0: |
There was a problem hiding this comment.
Сделайте логику ниже единой и непрерываемой на середине
- проверяется одно условие -> по нему добавляется фидбек -> проверяется следующее условие -> и так далее
- после всего -> return+answer'a было только два
- иначе сейчас одна проверка делает return - остальные не запускаются
No description provided.